package com.liuhouse1.controller;

import com.liuhouse1.pojo.Student;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class RedisController {

    /**
     * 注入RedisTemplate
     * 注意:RedisTemplate对象的名称就是redisTemplate
     */
    @Resource
    private RedisTemplate redisTemplate;


    @Resource
    private StringRedisTemplate stringRedisTemplate;


    //添加数据到redis , 使用restful的形式来写
    @PostMapping("/redis/addstring")
    public String addToRedis(String name , String value){
        //操作Redis中string类型的数据,先获取valueOperation对象
        ValueOperations valueOperations = redisTemplate.opsForValue();
        //添加数据到redis
        valueOperations.set(name , value);
        return "向redis添加string类型的数据";
    }

    //从redis中获取数据 , 通过键 获取值
    //可以获取到值,但是不跨平台
    @GetMapping("/redis/getk/{k}")
    public String getData(@PathVariable("k") String k){
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Object v = valueOperations.get(k);
        return "key是" + k + " 他的值是" + v;
    }

    //这里遇到了空指针的问题  主要原因即使 stringRedisTemplate 对象没有进行注入
    //往redis中设置值
    //其实 java对象也只是把别人的拿过来集成一下 使用一下而已
    @PostMapping("/str_redis/set_str/{k}/{v}")
    public String addStringKV(@PathVariable String k , @PathVariable String v){
        //使用StringRedisTemplate对象 , 获取操作字符串的对象
        ValueOperations opsForValue = stringRedisTemplate.opsForValue();
        opsForValue.set(k , v);
        return "使用StringReidsTemplate添加对象";
    }

    //获取redis中的值
    @GetMapping("/str_redis/get_str/{k}")
    public String getStringByK(@PathVariable("k") String k){
        ValueOperations<String, String> stringStringValueOperations = stringRedisTemplate.opsForValue();
        String s = stringStringValueOperations.get(k);
        return "通过" + k + "这个键获取的值是 :" + s;
    }


    /**
     * 设置RedisTemplate序列化
     * 可以设置 key 的序列化  也可以设置value的序列化
     * 可以同时设置key 和 value的序列化
     * 从今天开始一定要多 有谁 没水了就买
     * @param k
     * @param v
     * @return
     */
   @PostMapping("/redis/set_k_v_ser")
   public String setKVSerType(String k , String v){
        //使用redisTemplate
       //设置key使用String的序列化
       redisTemplate.setKeySerializer(new StringRedisSerializer());
       //设置value使用String的序列化
       redisTemplate.setValueSerializer(new StringRedisSerializer());
       redisTemplate.opsForValue().set(k , v);
       return "自定义RedisTemplate对象的key和value的序列化";
   }


   @PostMapping("/redis/addjson")
   public String addJson(){
       Student student = new Student();
       student.setId(1);
       student.setName("zhoujielun");
       student.setAge(15);
       //设置key的序列化方式
       redisTemplate.setKeySerializer(new StringRedisSerializer());
       //设置value的序列化方式
       redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
       //给redis缓存中设置值
       redisTemplate.opsForValue().set("student" , student);
       return "进行json序列化";
   }
   

   @GetMapping("/redis/getjson")
   public String getJson(){
       redisTemplate.setKeySerializer(new StringRedisSerializer());
       redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
       Object student = redisTemplate.opsForValue().get("student");
       return "json反序列化=" + student;
   }


}
